package Test.情感分析;

import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.neural.rnn.RNNCoreAnnotations;
import edu.stanford.nlp.sentiment.SentimentCoreAnnotations;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.util.CoreMap;

import java.util.List;
import java.util.Properties;

/**
 * https://blog.csdn.net/fenglingguitar/article/details/145683389
 */
public class SentimentAnalysis {
    public static void main(String[] args) {
        String text = "very very good！";
        /*
        这段代码是在设置一个属性，指定要使用的标注器（annotators）。
        具体来说，它创建了一个 Properties 对象，然后使用 setProperty 方法来设置 annotators
        属性的值为 "tokenize, ssplit, pos, lemma, ner"。这些标注器通常用于自然语言处理（NLP）任务中，
        对文本进行不同层次的标注和处理。以下是各个标注器的简要说明：
        tokenize：将文本分割成单词或句子等较小的单元。
        ssplit：句子分割，将文本分割成独立的句子。
        pos：词性标注，为每个单词标记其词性（如名词、动词等）。
        lemma：词形还原，将单词转换为其基本形式（如将 “running” 转换为 “run”）。
        ner：命名实体识别，识别文本中的命名实体，如人名、地名、组织名等。
        这段代码通常用于配置NLP处理流水线，以便对文本数据进行一系列的预处理步骤。
         */
        Properties props = new Properties();
        props.setProperty("annotators", "tokenize, ssplit, parse, sentiment");
        StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
        Annotation annotation = new Annotation(text);
        pipeline.annotate(annotation);
        for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) {
            Tree tree = sentence.get(SentimentCoreAnnotations.SentimentAnnotatedTree.class);
            int sentiment = RNNCoreAnnotations.getPredictedClass(tree);
            System.out.println(sentiment); // 0 very negative, 1 negative, 2 neutral, 3 positive, 4 very positive
        }

        // 创建一个空的 Annotation 对象，并设置文本
        Annotation document = new Annotation(text);

        // 运行所有指定的 annotators
        pipeline.annotate(document);

        List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);

        for (CoreMap sentence : sentences) {
            // 获取句子中的每个单词
            for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) {
                // 获取单词文本
                String word = token.word();
                // 获取词性标注
                String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class);
                // 获取词形还原
                String lemma = token.get(CoreAnnotations.LemmaAnnotation.class);
                // 获取命名实体标注
                String ne = token.get(CoreAnnotations.NamedEntityTagAnnotation.class);

                System.out.println("Word: " + word + " POS: " + pos + " Lemma: " + lemma + " NER: " + ne);
            }
        }
    }
}
